package org.cunamas.core.service.impl;

import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.cunamas.core.bean.AlmacenBean;
import org.cunamas.core.bean.AparienciaActitudesConductaBean;
import org.cunamas.core.bean.CalificacionBean;
import org.cunamas.core.bean.CocinaBean;
import org.cunamas.core.bean.CondicionesExternasBean;
import org.cunamas.core.bean.DocumentacionYRegistrosBean;
import org.cunamas.core.bean.ImplementosBasicosBean;
import org.cunamas.core.bean.InstrumentosDocumentacionRegistrosBean;
import org.cunamas.core.bean.ItemBean;
import org.cunamas.core.bean.LocalesBean;
import org.cunamas.core.bean.MedidasSeguridadBean;
import org.cunamas.core.bean.MedidasSeguridadLocalBean;
import org.cunamas.core.bean.RedAfiliadosBean;
import org.cunamas.core.bean.ServiciosAlimentariosBean;
import org.cunamas.core.dao.DynamicTextDao;
import org.cunamas.core.service.CrossMonitoringDataService;
import org.cunamas.web.util.CunamasConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class CrossMonitoringDataServiceImpl implements CrossMonitoringDataService {
	
	@Autowired
	private DynamicTextDao dynamicTextDao;

	public List<ServiciosAlimentariosBean> getItemsServiciosAlimentariosBean(List<ServiciosAlimentariosBean> list) {
		if(list==null) return null;
		
		List<ServiciosAlimentariosBean> serviciosAlimentariosBeans = new ArrayList<ServiciosAlimentariosBean>();
		ServiciosAlimentariosBean bean = null;
		
		for (ServiciosAlimentariosBean serviciosAlimentariosBean : list) {
			
			bean = getTotalPorcentajeServiciosAlimentariosBean(serviciosAlimentariosBean);
			serviciosAlimentariosBeans.add(bean);
		}
		
		return serviciosAlimentariosBeans;
	}
	
	
	public ServiciosAlimentariosBean getTotalServiciosAlimentariosBean(List<ServiciosAlimentariosBean> list) {
		if(list==null) return null;
		
		ServiciosAlimentariosBean totalesServiciosAlimentariosBean = new ServiciosAlimentariosBean();
		
		Long numeroComitesGestion = 0L;
		CocinaBean cocinaBean = totalesServiciosAlimentariosBean.getCocinaBean();
		AlmacenBean almacenBean = totalesServiciosAlimentariosBean.getAlmacenBean();
		MedidasSeguridadBean medidasSeguridadBean = totalesServiciosAlimentariosBean.getMedidasSeguridadBean();
		DocumentacionYRegistrosBean documentacionYRegistrosBean = totalesServiciosAlimentariosBean.getDocumentacionYRegistrosBean();
		RedAfiliadosBean redAfiliadosBean = totalesServiciosAlimentariosBean.getRedAfiliadosBean();
		Long totalOptimo = 0L;
		Long totalBueno = 0L;
		Long totalRegular = 0L;
		Long totalDeficiente = 0L;
		
		for (ServiciosAlimentariosBean serviciosAlimentariosBean : list) {
			
			numeroComitesGestion += serviciosAlimentariosBean.getNumeroComitesGestion();
			
			CocinaBean cocinaBean2 = serviciosAlimentariosBean.getCocinaBean();
			AlmacenBean almacenBean2 = serviciosAlimentariosBean.getAlmacenBean();
			MedidasSeguridadBean medidasSeguridadBean2 = serviciosAlimentariosBean.getMedidasSeguridadBean();
			DocumentacionYRegistrosBean documentacionYRegistrosBean2 = serviciosAlimentariosBean.getDocumentacionYRegistrosBean();
			RedAfiliadosBean redAfiliadosBean2 = serviciosAlimentariosBean.getRedAfiliadosBean();
			
			cocinaBean.setC311(cocinaBean.getC311() + cocinaBean2.getC311());
			cocinaBean.setC312(cocinaBean.getC312() + cocinaBean2.getC312());
			cocinaBean.setC313(cocinaBean.getC313() + cocinaBean2.getC313());
			cocinaBean.setC314(cocinaBean.getC314() + cocinaBean2.getC314());
			cocinaBean.setC315(cocinaBean.getC315() + cocinaBean2.getC315());
			cocinaBean.setC316(cocinaBean.getC316() + cocinaBean2.getC316());
			cocinaBean.setOptimo(cocinaBean.getOptimo() + cocinaBean2.getOptimo());
			cocinaBean.setBueno(cocinaBean.getBueno() + cocinaBean2.getBueno());
			cocinaBean.setRegular(cocinaBean.getRegular() + cocinaBean2.getRegular());
			cocinaBean.setDeficiente(cocinaBean.getDeficiente() + cocinaBean2.getDeficiente());
			
			almacenBean.setC321(almacenBean.getC321() + almacenBean2.getC321());
			almacenBean.setC322(almacenBean.getC322() + almacenBean2.getC322());
			almacenBean.setC323(almacenBean.getC323() + almacenBean2.getC323());
			almacenBean.setC324(almacenBean.getC324() + almacenBean2.getC324());
			almacenBean.setC325(almacenBean.getC325() + almacenBean2.getC325());
			almacenBean.setOptimo(almacenBean.getOptimo() + almacenBean2.getOptimo());
			almacenBean.setBueno(almacenBean.getBueno() + almacenBean2.getBueno());
			almacenBean.setRegular(almacenBean.getRegular() + almacenBean2.getRegular());
			almacenBean.setDeficiente(almacenBean.getDeficiente() + almacenBean2.getDeficiente());
			
			medidasSeguridadBean.setC331(medidasSeguridadBean.getC331() + medidasSeguridadBean2.getC331());
			medidasSeguridadBean.setC332(medidasSeguridadBean.getC332() + medidasSeguridadBean2.getC332());
			medidasSeguridadBean.setC333(medidasSeguridadBean.getC333() + medidasSeguridadBean2.getC333());
			medidasSeguridadBean.setC334(medidasSeguridadBean.getC334() + medidasSeguridadBean2.getC334());
			medidasSeguridadBean.setC335(medidasSeguridadBean.getC335() + medidasSeguridadBean2.getC335());
			medidasSeguridadBean.setC336(medidasSeguridadBean.getC336() + medidasSeguridadBean2.getC336());
			medidasSeguridadBean.setOptimo(medidasSeguridadBean.getOptimo() + medidasSeguridadBean2.getOptimo());
			medidasSeguridadBean.setBueno(medidasSeguridadBean.getBueno() + medidasSeguridadBean2.getBueno());
			medidasSeguridadBean.setRegular(medidasSeguridadBean.getRegular() + medidasSeguridadBean2.getRegular());
			medidasSeguridadBean.setDeficiente(medidasSeguridadBean.getDeficiente() + medidasSeguridadBean2.getDeficiente());
			
			documentacionYRegistrosBean.setC341(documentacionYRegistrosBean.getC341() + documentacionYRegistrosBean2.getC341());
			documentacionYRegistrosBean.setC342(documentacionYRegistrosBean.getC342() + documentacionYRegistrosBean2.getC342());
			documentacionYRegistrosBean.setC343(documentacionYRegistrosBean.getC343() + documentacionYRegistrosBean2.getC343());
			documentacionYRegistrosBean.setC344(documentacionYRegistrosBean.getC344() + documentacionYRegistrosBean2.getC344());
			documentacionYRegistrosBean.setC345(documentacionYRegistrosBean.getC345() + documentacionYRegistrosBean2.getC345());
			documentacionYRegistrosBean.setC346(documentacionYRegistrosBean.getC346() + documentacionYRegistrosBean2.getC346());
			documentacionYRegistrosBean.setC347(documentacionYRegistrosBean.getC347() + documentacionYRegistrosBean2.getC347());
			documentacionYRegistrosBean.setOptimo(documentacionYRegistrosBean.getOptimo() + documentacionYRegistrosBean2.getOptimo());
			documentacionYRegistrosBean.setBueno(documentacionYRegistrosBean.getBueno() + documentacionYRegistrosBean2.getBueno());
			documentacionYRegistrosBean.setRegular(documentacionYRegistrosBean.getRegular() + documentacionYRegistrosBean2.getRegular());
			documentacionYRegistrosBean.setDeficiente(documentacionYRegistrosBean.getDeficiente() + documentacionYRegistrosBean2.getDeficiente());
		
			redAfiliadosBean.setC351(redAfiliadosBean.getC351() + redAfiliadosBean2.getC351());
			redAfiliadosBean.setC352(redAfiliadosBean.getC352() + redAfiliadosBean2.getC352());
			redAfiliadosBean.setC353(redAfiliadosBean.getC353() + redAfiliadosBean2.getC353());
			redAfiliadosBean.setC354(redAfiliadosBean.getC354() + redAfiliadosBean2.getC354());
			redAfiliadosBean.setC355(redAfiliadosBean.getC355() + redAfiliadosBean2.getC355());
			redAfiliadosBean.setOptimo(redAfiliadosBean.getOptimo() + redAfiliadosBean2.getOptimo());
			redAfiliadosBean.setBueno(redAfiliadosBean.getBueno() + redAfiliadosBean2.getBueno());
			redAfiliadosBean.setRegular(redAfiliadosBean.getRegular() + redAfiliadosBean2.getRegular());
			redAfiliadosBean.setDeficiente(redAfiliadosBean.getDeficiente() + redAfiliadosBean2.getDeficiente());
			
			totalOptimo += serviciosAlimentariosBean.getTotalOptimo();
			totalBueno += serviciosAlimentariosBean.getTotalBueno();
			totalRegular += serviciosAlimentariosBean.getTotalRegular();
			totalDeficiente += serviciosAlimentariosBean.getTotalDeficiente();
		}
		
		totalesServiciosAlimentariosBean.setNumeroComitesGestion(numeroComitesGestion);
		totalesServiciosAlimentariosBean.setCocinaBean(cocinaBean);
		totalesServiciosAlimentariosBean.setAlmacenBean(almacenBean);
		totalesServiciosAlimentariosBean.setMedidasSeguridadBean(medidasSeguridadBean);
		totalesServiciosAlimentariosBean.setDocumentacionYRegistrosBean(documentacionYRegistrosBean);
		totalesServiciosAlimentariosBean.setRedAfiliadosBean(redAfiliadosBean);
		totalesServiciosAlimentariosBean.setTotalOptimo(totalOptimo);
		totalesServiciosAlimentariosBean.setTotalBueno(totalBueno);
		totalesServiciosAlimentariosBean.setTotalRegular(totalRegular);
		totalesServiciosAlimentariosBean.setTotalDeficiente(totalDeficiente);
		
		totalesServiciosAlimentariosBean = getTotalPorcentajeServiciosAlimentariosBean(totalesServiciosAlimentariosBean);
		
		return totalesServiciosAlimentariosBean;
	}

	private ServiciosAlimentariosBean getTotalPorcentajeServiciosAlimentariosBean(ServiciosAlimentariosBean totalesServiciosAlimentariosBean) {
//		ServiciosAlimentariosBean totalesPorcentajeServiciosAlimentariosBean = new ServiciosAlimentariosBean();
		ServiciosAlimentariosBean totalesPorcentajeServiciosAlimentariosBean = totalesServiciosAlimentariosBean;
		
		Long numeroComitesGestion = totalesServiciosAlimentariosBean.getNumeroComitesGestion();
		CocinaBean cocinaBean = totalesServiciosAlimentariosBean.getCocinaBean();
		AlmacenBean almacenBean = totalesServiciosAlimentariosBean.getAlmacenBean();
		MedidasSeguridadBean medidasSeguridadBean = totalesServiciosAlimentariosBean.getMedidasSeguridadBean();
		DocumentacionYRegistrosBean documentacionYRegistrosBean = totalesServiciosAlimentariosBean.getDocumentacionYRegistrosBean();
		RedAfiliadosBean redAfiliadosBean = totalesServiciosAlimentariosBean.getRedAfiliadosBean();
		
		totalesPorcentajeServiciosAlimentariosBean.setNumeroComitesGestion(numeroComitesGestion);
		cocinaBean = getTotalesPorcentajeCocinaBean(cocinaBean, numeroComitesGestion);
		almacenBean = getTotalesPorcentajeAlmacenBean(almacenBean, numeroComitesGestion);
		medidasSeguridadBean = getTotalesPorcentajeMedidasSeguridadBean(medidasSeguridadBean, numeroComitesGestion);
		documentacionYRegistrosBean = getTotalesPorcentajeDocumentacionYRegistrosBean(documentacionYRegistrosBean, numeroComitesGestion);
		redAfiliadosBean = getTotalesPorcentajeRedAfiliadosBean(redAfiliadosBean, numeroComitesGestion);
		
		totalesPorcentajeServiciosAlimentariosBean.setNumeroComitesGestion(numeroComitesGestion);
		totalesPorcentajeServiciosAlimentariosBean.setCocinaBean(cocinaBean);
		totalesPorcentajeServiciosAlimentariosBean.setAlmacenBean(almacenBean);
		totalesPorcentajeServiciosAlimentariosBean.setMedidasSeguridadBean(medidasSeguridadBean);
		totalesPorcentajeServiciosAlimentariosBean.setDocumentacionYRegistrosBean(documentacionYRegistrosBean);
		totalesPorcentajeServiciosAlimentariosBean.setRedAfiliadosBean(redAfiliadosBean);
		
		if(numeroComitesGestion>0){
			totalesPorcentajeServiciosAlimentariosBean.setPctTotalOptimo(new BigDecimal(totalesPorcentajeServiciosAlimentariosBean.getTotalOptimo()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			totalesPorcentajeServiciosAlimentariosBean.setPctTotalBueno(new BigDecimal(totalesPorcentajeServiciosAlimentariosBean.getTotalBueno()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			totalesPorcentajeServiciosAlimentariosBean.setPctTotalRegular(new BigDecimal(totalesPorcentajeServiciosAlimentariosBean.getTotalRegular()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			totalesPorcentajeServiciosAlimentariosBean.setPctTotalDeficiente(new BigDecimal(totalesPorcentajeServiciosAlimentariosBean.getTotalDeficiente()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
		}

		totalesPorcentajeServiciosAlimentariosBean.setCalificacion(getCalificacionIndicador(totalesPorcentajeServiciosAlimentariosBean));
		
		return totalesPorcentajeServiciosAlimentariosBean;
	}

	private RedAfiliadosBean getTotalesPorcentajeRedAfiliadosBean(RedAfiliadosBean redAfiliadosBean, Long numeroComitesGestion) {
		if(numeroComitesGestion>0){
			redAfiliadosBean.setPct351(new BigDecimal(redAfiliadosBean.getC351()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			redAfiliadosBean.setPct352(new BigDecimal(redAfiliadosBean.getC352()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			redAfiliadosBean.setPct353(new BigDecimal(redAfiliadosBean.getC353()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			redAfiliadosBean.setPct354(new BigDecimal(redAfiliadosBean.getC354()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			redAfiliadosBean.setPct355(new BigDecimal(redAfiliadosBean.getC355()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			
			redAfiliadosBean.setPctOptimo(new BigDecimal(redAfiliadosBean.getOptimo()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			redAfiliadosBean.setPctBueno(new BigDecimal(redAfiliadosBean.getBueno()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			redAfiliadosBean.setPctRegular(new BigDecimal(redAfiliadosBean.getRegular()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			redAfiliadosBean.setPctDeficiente(new BigDecimal(redAfiliadosBean.getDeficiente()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
		}
		redAfiliadosBean.setCalificacion(getCalificacionIndicador(redAfiliadosBean));
		
		return redAfiliadosBean;
	}

	private DocumentacionYRegistrosBean getTotalesPorcentajeDocumentacionYRegistrosBean(DocumentacionYRegistrosBean documentacionYRegistrosBean,Long numeroComitesGestion) {
		if(numeroComitesGestion>0){
			documentacionYRegistrosBean.setPct341(new BigDecimal(documentacionYRegistrosBean.getC341()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			documentacionYRegistrosBean.setPct342(new BigDecimal(documentacionYRegistrosBean.getC342()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			documentacionYRegistrosBean.setPct343(new BigDecimal(documentacionYRegistrosBean.getC343()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			documentacionYRegistrosBean.setPct344(new BigDecimal(documentacionYRegistrosBean.getC344()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			documentacionYRegistrosBean.setPct345(new BigDecimal(documentacionYRegistrosBean.getC345()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			documentacionYRegistrosBean.setPct346(new BigDecimal(documentacionYRegistrosBean.getC346()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			documentacionYRegistrosBean.setPct347(new BigDecimal(documentacionYRegistrosBean.getC347()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			
			documentacionYRegistrosBean.setPctOptimo(new BigDecimal(documentacionYRegistrosBean.getOptimo()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			documentacionYRegistrosBean.setPctBueno(new BigDecimal(documentacionYRegistrosBean.getBueno()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			documentacionYRegistrosBean.setPctRegular(new BigDecimal(documentacionYRegistrosBean.getRegular()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			documentacionYRegistrosBean.setPctDeficiente(new BigDecimal(documentacionYRegistrosBean.getDeficiente()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
		}
		
		documentacionYRegistrosBean.setCalificacion(getCalificacionIndicador(documentacionYRegistrosBean));
		
		return documentacionYRegistrosBean;
	}

	private MedidasSeguridadBean getTotalesPorcentajeMedidasSeguridadBean(MedidasSeguridadBean medidasSeguridadBean, Long numeroComitesGestion) {
		if(numeroComitesGestion>0){
			medidasSeguridadBean.setPct331(new BigDecimal(medidasSeguridadBean.getC331()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			medidasSeguridadBean.setPct332(new BigDecimal(medidasSeguridadBean.getC332()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			medidasSeguridadBean.setPct333(new BigDecimal(medidasSeguridadBean.getC333()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			medidasSeguridadBean.setPct334(new BigDecimal(medidasSeguridadBean.getC334()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			medidasSeguridadBean.setPct335(new BigDecimal(medidasSeguridadBean.getC335()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			medidasSeguridadBean.setPct336(new BigDecimal(medidasSeguridadBean.getC336()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			
			medidasSeguridadBean.setPctOptimo(new BigDecimal(medidasSeguridadBean.getOptimo()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			medidasSeguridadBean.setPctBueno(new BigDecimal(medidasSeguridadBean.getBueno()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			medidasSeguridadBean.setPctRegular(new BigDecimal(medidasSeguridadBean.getRegular()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			medidasSeguridadBean.setPctDeficiente(new BigDecimal(medidasSeguridadBean.getDeficiente()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
		}
		
		medidasSeguridadBean.setCalificacion(getCalificacionIndicador(medidasSeguridadBean));
		
		return medidasSeguridadBean;
	}

	private AlmacenBean getTotalesPorcentajeAlmacenBean(AlmacenBean almacenBean, Long numeroComitesGestion) {
		if(numeroComitesGestion>0){
			almacenBean.setPct321(new BigDecimal(almacenBean.getC321()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			almacenBean.setPct322(new BigDecimal(almacenBean.getC322()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			almacenBean.setPct323(new BigDecimal(almacenBean.getC323()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			almacenBean.setPct324(new BigDecimal(almacenBean.getC324()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			almacenBean.setPct325(new BigDecimal(almacenBean.getC325()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			
			almacenBean.setPctOptimo(new BigDecimal(almacenBean.getOptimo()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			almacenBean.setPctBueno(new BigDecimal(almacenBean.getBueno()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			almacenBean.setPctRegular(new BigDecimal(almacenBean.getRegular()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			almacenBean.setPctDeficiente(new BigDecimal(almacenBean.getDeficiente()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
		}
		
		almacenBean.setCalificacion(getCalificacionIndicador(almacenBean));
		
		return almacenBean;
	}

	private CocinaBean getTotalesPorcentajeCocinaBean(CocinaBean cocinaBean,Long numeroComitesGestion) {
		if(numeroComitesGestion>0){
			cocinaBean.setPct311(new BigDecimal(cocinaBean.getC311()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			cocinaBean.setPct312(new BigDecimal(cocinaBean.getC312()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			cocinaBean.setPct313(new BigDecimal(cocinaBean.getC313()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			cocinaBean.setPct314(new BigDecimal(cocinaBean.getC314()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			cocinaBean.setPct315(new BigDecimal(cocinaBean.getC315()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			cocinaBean.setPct316(new BigDecimal(cocinaBean.getC316()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			
			cocinaBean.setPctOptimo(new BigDecimal(cocinaBean.getOptimo()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			cocinaBean.setPctBueno(new BigDecimal(cocinaBean.getBueno()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			cocinaBean.setPctRegular(new BigDecimal(cocinaBean.getRegular()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			cocinaBean.setPctDeficiente(new BigDecimal(cocinaBean.getDeficiente()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
		}
		
		cocinaBean.setCalificacion(getCalificacionIndicador(cocinaBean));
		
		return cocinaBean;
	}
	
	private String getCalificacionIndicador(Object indicador){
		
		if(indicador instanceof ServiciosAlimentariosBean){
			return getCalificacionEnRango(((ServiciosAlimentariosBean) indicador).getPctTotalOptimo().doubleValue() + 
					((ServiciosAlimentariosBean) indicador).getPctTotalBueno().doubleValue());
		}
		
		if(indicador instanceof CocinaBean){
			return getCalificacionEnRango(((CocinaBean) indicador).getPctOptimo().doubleValue() + 
					((CocinaBean) indicador).getPctBueno().doubleValue());
		}
		
		if(indicador instanceof AlmacenBean){
			return getCalificacionEnRango(((AlmacenBean) indicador).getPctOptimo().doubleValue() + 
					((AlmacenBean) indicador).getPctBueno().doubleValue());
		}
		
		if(indicador instanceof MedidasSeguridadBean){
			return getCalificacionEnRango(((MedidasSeguridadBean) indicador).getPctOptimo().doubleValue() + 
					((MedidasSeguridadBean) indicador).getPctBueno().doubleValue());
		}
		
		if(indicador instanceof DocumentacionYRegistrosBean){
			return getCalificacionEnRango(((DocumentacionYRegistrosBean) indicador).getPctOptimo().doubleValue() + 
					((DocumentacionYRegistrosBean) indicador).getPctBueno().doubleValue());
		}
		
		if(indicador instanceof RedAfiliadosBean){
			return getCalificacionEnRango(((RedAfiliadosBean) indicador).getPctOptimo().doubleValue() + 
					((RedAfiliadosBean) indicador).getPctBueno().doubleValue());
		}
		
		/*******************/
		
		if(indicador instanceof LocalesBean){
			return getCalificacionEnRango(((LocalesBean) indicador).getPctTotalOptimo().doubleValue() + 
					((LocalesBean) indicador).getPctTotalBueno().doubleValue());
		}
		
		if(indicador instanceof CondicionesExternasBean){
			return getCalificacionEnRango(((CondicionesExternasBean) indicador).getPctOptimo().doubleValue() + 
					((CondicionesExternasBean) indicador).getPctBueno().doubleValue());
		}
		
		if(indicador instanceof MedidasSeguridadLocalBean){
			return getCalificacionEnRango(((MedidasSeguridadLocalBean) indicador).getPctOptimo().doubleValue() + 
					((MedidasSeguridadLocalBean) indicador).getPctBueno().doubleValue());
		}
		
		if(indicador instanceof ImplementosBasicosBean){
			return getCalificacionEnRango(((ImplementosBasicosBean) indicador).getPctOptimo().doubleValue() + 
					((ImplementosBasicosBean) indicador).getPctBueno().doubleValue());
		}
		
		if(indicador instanceof InstrumentosDocumentacionRegistrosBean){
			return getCalificacionEnRango(((InstrumentosDocumentacionRegistrosBean) indicador).getPctOptimo().doubleValue() + 
					((InstrumentosDocumentacionRegistrosBean) indicador).getPctBueno().doubleValue());
		}
		
		if(indicador instanceof AparienciaActitudesConductaBean){
			return getCalificacionEnRango(((AparienciaActitudesConductaBean) indicador).getPctOptimo().doubleValue() + 
					((AparienciaActitudesConductaBean) indicador).getPctBueno().doubleValue());
		}
		
		return null;
	}
	
	/***********************************************/
	
	private String getCalificacionEnRango(double calificacion){
		if(calificacion >= 0 && calificacion < 0.50){
			return CunamasConstants.CALIFICACION_DEFICIENTE;
		}
		
		if(calificacion >= 0.50 && calificacion < 0.75){
			return CunamasConstants.CALIFICACION_REGULAR;
		}
		
		if(calificacion >= 0.75 && calificacion < 0.90){
			return CunamasConstants.CALIFICACION_BUENO;
		}
		
		if(calificacion >= 0.90){ // && calificacion <= 1.00
			return CunamasConstants.CALIFICACION_OPTIMO;
		}
		
		return null;
	}
	
	
	/***********************************************/

	public List<LocalesBean> getItemsLocalesBean(List<LocalesBean> list) {
		if(list==null) return null;
		
		List<LocalesBean> localesBeans = new ArrayList<LocalesBean>();
		LocalesBean bean = null;
		
		for (LocalesBean LocalesBean : list) {
			
			bean = getTotalPorcentajeLocalesBean(LocalesBean);
			localesBeans.add(bean);
		}
		
		return localesBeans;
	}
	
	
	public LocalesBean getTotalLocalesBean(List<LocalesBean> list) {
		if(list==null) return null;
		
		LocalesBean totalesLocalesBean = new LocalesBean();
		
		Long numeroComitesGestion = 0L;
		Long numeroLocales = 0L;
		CondicionesExternasBean condicionesExternasBean = new CondicionesExternasBean();
		MedidasSeguridadLocalBean medidasSeguridadLocalBean = new MedidasSeguridadLocalBean();
		ImplementosBasicosBean implementosBasicosBean = new ImplementosBasicosBean();
		InstrumentosDocumentacionRegistrosBean instrumentosDocumentacionRegistrosBean = new InstrumentosDocumentacionRegistrosBean();
		AparienciaActitudesConductaBean aparienciaActitudesConductaBean = new AparienciaActitudesConductaBean();
		Long totalOptimo = 0L;
		Long totalBueno = 0L;
		Long totalRegular = 0L;
		Long totalDeficiente = 0L;
		
		for (LocalesBean localesBean : list) {
			
			numeroComitesGestion += localesBean.getNumeroComitesGestion();
			numeroLocales += localesBean.getNumeroLocales();
			
			CondicionesExternasBean condicionesExternasBean2 = localesBean.getCondicionesExternasBean();
			MedidasSeguridadLocalBean medidasSeguridadLocalBean2 = localesBean.getMedidasSeguridadLocalBean();
			ImplementosBasicosBean implementosBasicosBean2 = localesBean.getImplementosBasicosBean();
			InstrumentosDocumentacionRegistrosBean instrumentosDocumentacionRegistrosBean2 = localesBean.getInstrumentosDocumentacionRegistrosBean();
			AparienciaActitudesConductaBean aparienciaActitudesConductaBean2 = localesBean.getAparienciaActitudesConductaBean();
			
			condicionesExternasBean.setC22(condicionesExternasBean.getC22() + condicionesExternasBean2.getC22());
			condicionesExternasBean.setC23(condicionesExternasBean.getC23() + condicionesExternasBean2.getC23());
			
			medidasSeguridadLocalBean.setC411(medidasSeguridadLocalBean.getC411() + medidasSeguridadLocalBean2.getC411());
			medidasSeguridadLocalBean.setC412(medidasSeguridadLocalBean.getC412() + medidasSeguridadLocalBean2.getC412());
			medidasSeguridadLocalBean.setC413(medidasSeguridadLocalBean.getC413() + medidasSeguridadLocalBean2.getC413());
			medidasSeguridadLocalBean.setC414(medidasSeguridadLocalBean.getC414() + medidasSeguridadLocalBean2.getC414());
			medidasSeguridadLocalBean.setC415(medidasSeguridadLocalBean.getC415() + medidasSeguridadLocalBean2.getC415());
			medidasSeguridadLocalBean.setC416(medidasSeguridadLocalBean.getC416() + medidasSeguridadLocalBean2.getC416());
			medidasSeguridadLocalBean.setC417(medidasSeguridadLocalBean.getC417() + medidasSeguridadLocalBean2.getC417());
			medidasSeguridadLocalBean.setOptimo(medidasSeguridadLocalBean.getOptimo() + medidasSeguridadLocalBean2.getOptimo());
			medidasSeguridadLocalBean.setBueno(medidasSeguridadLocalBean.getBueno() + medidasSeguridadLocalBean2.getBueno());
			medidasSeguridadLocalBean.setRegular(medidasSeguridadLocalBean.getRegular() + medidasSeguridadLocalBean2.getRegular());
			medidasSeguridadLocalBean.setDeficiente(medidasSeguridadLocalBean.getDeficiente() + medidasSeguridadLocalBean2.getDeficiente());
			
			implementosBasicosBean.setC421(implementosBasicosBean.getC421() + implementosBasicosBean2.getC421());
			implementosBasicosBean.setC422(implementosBasicosBean.getC422() + implementosBasicosBean2.getC422());
			implementosBasicosBean.setC423(implementosBasicosBean.getC423() + implementosBasicosBean2.getC423());
			implementosBasicosBean.setC424(implementosBasicosBean.getC424() + implementosBasicosBean2.getC424());
			implementosBasicosBean.setC425(implementosBasicosBean.getC425() + implementosBasicosBean2.getC425());
			implementosBasicosBean.setC426(implementosBasicosBean.getC426() + implementosBasicosBean2.getC426());
			implementosBasicosBean.setC427(implementosBasicosBean.getC427() + implementosBasicosBean2.getC427());
			implementosBasicosBean.setC428(implementosBasicosBean.getC428() + implementosBasicosBean2.getC428());
			implementosBasicosBean.setOptimo(implementosBasicosBean.getOptimo() + implementosBasicosBean2.getOptimo());
			implementosBasicosBean.setBueno(implementosBasicosBean.getBueno() + implementosBasicosBean2.getBueno());
			implementosBasicosBean.setRegular(implementosBasicosBean.getRegular() + implementosBasicosBean2.getRegular());
			implementosBasicosBean.setDeficiente(implementosBasicosBean.getDeficiente() + implementosBasicosBean2.getDeficiente());
			
			instrumentosDocumentacionRegistrosBean.setC431(instrumentosDocumentacionRegistrosBean.getC431() + instrumentosDocumentacionRegistrosBean2.getC431());
			instrumentosDocumentacionRegistrosBean.setC432(instrumentosDocumentacionRegistrosBean.getC432() + instrumentosDocumentacionRegistrosBean2.getC432());
			instrumentosDocumentacionRegistrosBean.setC433(instrumentosDocumentacionRegistrosBean.getC433() + instrumentosDocumentacionRegistrosBean2.getC433());
			instrumentosDocumentacionRegistrosBean.setC434(instrumentosDocumentacionRegistrosBean.getC434() + instrumentosDocumentacionRegistrosBean2.getC434());
			instrumentosDocumentacionRegistrosBean.setC435(instrumentosDocumentacionRegistrosBean.getC435() + instrumentosDocumentacionRegistrosBean2.getC435());
			instrumentosDocumentacionRegistrosBean.setC436(instrumentosDocumentacionRegistrosBean.getC436() + instrumentosDocumentacionRegistrosBean2.getC436());
			instrumentosDocumentacionRegistrosBean.setC437(instrumentosDocumentacionRegistrosBean.getC437() + instrumentosDocumentacionRegistrosBean2.getC437());
			instrumentosDocumentacionRegistrosBean.setC438(instrumentosDocumentacionRegistrosBean.getC438() + instrumentosDocumentacionRegistrosBean2.getC438());
			instrumentosDocumentacionRegistrosBean.setC439(instrumentosDocumentacionRegistrosBean.getC439() + instrumentosDocumentacionRegistrosBean2.getC439());
			instrumentosDocumentacionRegistrosBean.setC4310(instrumentosDocumentacionRegistrosBean.getC4310() + instrumentosDocumentacionRegistrosBean2.getC4310());
			instrumentosDocumentacionRegistrosBean.setOptimo(instrumentosDocumentacionRegistrosBean.getOptimo() + instrumentosDocumentacionRegistrosBean2.getOptimo());
			instrumentosDocumentacionRegistrosBean.setBueno(instrumentosDocumentacionRegistrosBean.getBueno() + instrumentosDocumentacionRegistrosBean2.getBueno());
			instrumentosDocumentacionRegistrosBean.setRegular(instrumentosDocumentacionRegistrosBean.getRegular() + instrumentosDocumentacionRegistrosBean2.getRegular());
			instrumentosDocumentacionRegistrosBean.setDeficiente(instrumentosDocumentacionRegistrosBean.getDeficiente() + instrumentosDocumentacionRegistrosBean2.getDeficiente());
			
			aparienciaActitudesConductaBean.setC441(aparienciaActitudesConductaBean.getC441() + aparienciaActitudesConductaBean2.getC441());
			aparienciaActitudesConductaBean.setC442(aparienciaActitudesConductaBean.getC442() + aparienciaActitudesConductaBean2.getC442());
			aparienciaActitudesConductaBean.setC443(aparienciaActitudesConductaBean.getC443() + aparienciaActitudesConductaBean2.getC443());
			aparienciaActitudesConductaBean.setC444(aparienciaActitudesConductaBean.getC444() + aparienciaActitudesConductaBean2.getC444());
			aparienciaActitudesConductaBean.setC445(aparienciaActitudesConductaBean.getC445() + aparienciaActitudesConductaBean2.getC445());
			aparienciaActitudesConductaBean.setOptimo(aparienciaActitudesConductaBean.getOptimo() + aparienciaActitudesConductaBean2.getOptimo());
			aparienciaActitudesConductaBean.setBueno(aparienciaActitudesConductaBean.getBueno() + aparienciaActitudesConductaBean2.getBueno());
			aparienciaActitudesConductaBean.setRegular(aparienciaActitudesConductaBean.getRegular() + aparienciaActitudesConductaBean2.getRegular());
			aparienciaActitudesConductaBean.setDeficiente(aparienciaActitudesConductaBean.getDeficiente() + aparienciaActitudesConductaBean2.getDeficiente());
			
			totalOptimo += localesBean.getTotalOptimo();
			totalBueno += localesBean.getTotalBueno();
			totalRegular += localesBean.getTotalRegular();
			totalDeficiente += localesBean.getTotalDeficiente();
		}
		
		totalesLocalesBean.setNumeroComitesGestion(numeroComitesGestion);
		totalesLocalesBean.setNumeroLocales(numeroLocales);
		totalesLocalesBean.setCondicionesExternasBean(condicionesExternasBean);
		totalesLocalesBean.setMedidasSeguridadLocalBean(medidasSeguridadLocalBean);
		totalesLocalesBean.setImplementosBasicosBean(implementosBasicosBean);
		totalesLocalesBean.setInstrumentosDocumentacionRegistrosBean(instrumentosDocumentacionRegistrosBean);
		totalesLocalesBean.setAparienciaActitudesConductaBean(aparienciaActitudesConductaBean);
		totalesLocalesBean.setTotalOptimo(totalOptimo);
		totalesLocalesBean.setTotalBueno(totalBueno);
		totalesLocalesBean.setTotalRegular(totalRegular);
		totalesLocalesBean.setTotalDeficiente(totalDeficiente);
		
		totalesLocalesBean = getTotalPorcentajeLocalesBean(totalesLocalesBean);
		
		return totalesLocalesBean;
	}

	private LocalesBean getTotalPorcentajeLocalesBean(LocalesBean totalesLocalesBean) {
//		LocalesBean totalesPorcentajeLocalesBean = new LocalesBean();
		LocalesBean totalesPorcentajeLocalesBean = totalesLocalesBean;
		
		Long numeroComitesGestion = totalesLocalesBean.getNumeroComitesGestion();
		Long numeroLocales = totalesLocalesBean.getNumeroLocales();
		
		CondicionesExternasBean condicionesExternasBean = totalesLocalesBean.getCondicionesExternasBean();
		MedidasSeguridadLocalBean medidasSeguridadLocalBean = totalesLocalesBean.getMedidasSeguridadLocalBean();
		ImplementosBasicosBean implementosBasicosBean = totalesLocalesBean.getImplementosBasicosBean();
		InstrumentosDocumentacionRegistrosBean instrumentosDocumentacionRegistrosBean = totalesLocalesBean.getInstrumentosDocumentacionRegistrosBean();
		AparienciaActitudesConductaBean aparienciaActitudesConductaBean = totalesLocalesBean.getAparienciaActitudesConductaBean();
		
		totalesPorcentajeLocalesBean.setNumeroComitesGestion(numeroComitesGestion);
		totalesPorcentajeLocalesBean.setNumeroLocales(numeroLocales);
		condicionesExternasBean = getTotalesPorcentajeCondicionesExternasBean(condicionesExternasBean, numeroComitesGestion, numeroLocales);
		medidasSeguridadLocalBean = getTotalesPorcentajeMedidasSeguridadLocalBean(medidasSeguridadLocalBean, numeroComitesGestion, numeroLocales);
		implementosBasicosBean = getTotalesPorcentajeImplementosBasicosBean(implementosBasicosBean, numeroComitesGestion, numeroLocales);
		instrumentosDocumentacionRegistrosBean = getTotalesPorcentajeInstrumentosDocumentacionRegistrosBean(instrumentosDocumentacionRegistrosBean, numeroComitesGestion, numeroLocales);
		aparienciaActitudesConductaBean = getTotalesPorcentajeAparienciaActitudesConductaBean(aparienciaActitudesConductaBean, numeroComitesGestion, numeroLocales);
		
		totalesPorcentajeLocalesBean.setNumeroComitesGestion(numeroComitesGestion);
		totalesPorcentajeLocalesBean.setCondicionesExternasBean(condicionesExternasBean);
		totalesPorcentajeLocalesBean.setMedidasSeguridadLocalBean(medidasSeguridadLocalBean);
		totalesPorcentajeLocalesBean.setImplementosBasicosBean(implementosBasicosBean);
		totalesPorcentajeLocalesBean.setInstrumentosDocumentacionRegistrosBean(instrumentosDocumentacionRegistrosBean);
		totalesPorcentajeLocalesBean.setAparienciaActitudesConductaBean(aparienciaActitudesConductaBean);
		
		if(numeroComitesGestion>0){
			totalesPorcentajeLocalesBean.setPctTotalOptimo(new BigDecimal(totalesPorcentajeLocalesBean.getTotalOptimo()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			totalesPorcentajeLocalesBean.setPctTotalBueno(new BigDecimal(totalesPorcentajeLocalesBean.getTotalBueno()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			totalesPorcentajeLocalesBean.setPctTotalRegular(new BigDecimal(totalesPorcentajeLocalesBean.getTotalRegular()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			totalesPorcentajeLocalesBean.setPctTotalDeficiente(new BigDecimal(totalesPorcentajeLocalesBean.getTotalDeficiente()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
		}
		
		totalesPorcentajeLocalesBean.setCalificacion(getCalificacionIndicador(totalesPorcentajeLocalesBean));
		
		return totalesPorcentajeLocalesBean;
	}

	private AparienciaActitudesConductaBean getTotalesPorcentajeAparienciaActitudesConductaBean(AparienciaActitudesConductaBean aparienciaActitudesConductaBean,Long numeroComitesGestion, Long numeroLocales) {
		if(numeroLocales>0){
			aparienciaActitudesConductaBean.setPct441(new BigDecimal(aparienciaActitudesConductaBean.getC441()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			aparienciaActitudesConductaBean.setPct442(new BigDecimal(aparienciaActitudesConductaBean.getC442()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			aparienciaActitudesConductaBean.setPct443(new BigDecimal(aparienciaActitudesConductaBean.getC443()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			aparienciaActitudesConductaBean.setPct444(new BigDecimal(aparienciaActitudesConductaBean.getC444()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			aparienciaActitudesConductaBean.setPct445(new BigDecimal(aparienciaActitudesConductaBean.getC445()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
		}
		
		if(numeroComitesGestion>0){
			aparienciaActitudesConductaBean.setPctOptimo(new BigDecimal(aparienciaActitudesConductaBean.getOptimo()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			aparienciaActitudesConductaBean.setPctBueno(new BigDecimal(aparienciaActitudesConductaBean.getBueno()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			aparienciaActitudesConductaBean.setPctRegular(new BigDecimal(aparienciaActitudesConductaBean.getRegular()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			aparienciaActitudesConductaBean.setPctDeficiente(new BigDecimal(aparienciaActitudesConductaBean.getDeficiente()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
		}
		aparienciaActitudesConductaBean.setCalificacion(getCalificacionIndicador(aparienciaActitudesConductaBean));
		
		return aparienciaActitudesConductaBean;
	}


	private InstrumentosDocumentacionRegistrosBean getTotalesPorcentajeInstrumentosDocumentacionRegistrosBean(InstrumentosDocumentacionRegistrosBean instrumentosDocumentacionRegistrosBean,Long numeroComitesGestion, Long numeroLocales) {
		if(numeroLocales>0){
			instrumentosDocumentacionRegistrosBean.setPct431(new BigDecimal(instrumentosDocumentacionRegistrosBean.getC431()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPct432(new BigDecimal(instrumentosDocumentacionRegistrosBean.getC432()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPct433(new BigDecimal(instrumentosDocumentacionRegistrosBean.getC433()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPct434(new BigDecimal(instrumentosDocumentacionRegistrosBean.getC434()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPct435(new BigDecimal(instrumentosDocumentacionRegistrosBean.getC435()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPct436(new BigDecimal(instrumentosDocumentacionRegistrosBean.getC436()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPct437(new BigDecimal(instrumentosDocumentacionRegistrosBean.getC437()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPct438(new BigDecimal(instrumentosDocumentacionRegistrosBean.getC438()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPct439(new BigDecimal(instrumentosDocumentacionRegistrosBean.getC439()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPct4310(new BigDecimal(instrumentosDocumentacionRegistrosBean.getC4310()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
		}
		
		if(numeroComitesGestion>0){
			instrumentosDocumentacionRegistrosBean.setPctOptimo(new BigDecimal(instrumentosDocumentacionRegistrosBean.getOptimo()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPctBueno(new BigDecimal(instrumentosDocumentacionRegistrosBean.getBueno()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPctRegular(new BigDecimal(instrumentosDocumentacionRegistrosBean.getRegular()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			instrumentosDocumentacionRegistrosBean.setPctDeficiente(new BigDecimal(instrumentosDocumentacionRegistrosBean.getDeficiente()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
		}
		
		instrumentosDocumentacionRegistrosBean.setCalificacion(getCalificacionIndicador(instrumentosDocumentacionRegistrosBean));
		
		return instrumentosDocumentacionRegistrosBean;
	}


	private ImplementosBasicosBean getTotalesPorcentajeImplementosBasicosBean(ImplementosBasicosBean implementosBasicosBean,Long numeroComitesGestion, Long numeroLocales) {
		if(numeroLocales>0){
			implementosBasicosBean.setPct421(new BigDecimal(implementosBasicosBean.getC421()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			implementosBasicosBean.setPct422(new BigDecimal(implementosBasicosBean.getC422()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			implementosBasicosBean.setPct423(new BigDecimal(implementosBasicosBean.getC423()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			implementosBasicosBean.setPct424(new BigDecimal(implementosBasicosBean.getC424()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			implementosBasicosBean.setPct425(new BigDecimal(implementosBasicosBean.getC425()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			implementosBasicosBean.setPct426(new BigDecimal(implementosBasicosBean.getC426()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			implementosBasicosBean.setPct427(new BigDecimal(implementosBasicosBean.getC427()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			implementosBasicosBean.setPct428(new BigDecimal(implementosBasicosBean.getC428()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
		}
		
		if(numeroComitesGestion>0){
			implementosBasicosBean.setPctOptimo(new BigDecimal(implementosBasicosBean.getOptimo()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			implementosBasicosBean.setPctBueno(new BigDecimal(implementosBasicosBean.getBueno()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			implementosBasicosBean.setPctRegular(new BigDecimal(implementosBasicosBean.getRegular()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			implementosBasicosBean.setPctDeficiente(new BigDecimal(implementosBasicosBean.getDeficiente()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
		}
		
		implementosBasicosBean.setCalificacion(getCalificacionIndicador(implementosBasicosBean));
		
		return implementosBasicosBean;
	}


	private MedidasSeguridadLocalBean getTotalesPorcentajeMedidasSeguridadLocalBean(MedidasSeguridadLocalBean medidasSeguridadLocalBean,Long numeroComitesGestion, Long numeroLocales) {
		if(numeroLocales>0){
			medidasSeguridadLocalBean.setPct411(new BigDecimal(medidasSeguridadLocalBean.getC411()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			medidasSeguridadLocalBean.setPct412(new BigDecimal(medidasSeguridadLocalBean.getC412()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			medidasSeguridadLocalBean.setPct413(new BigDecimal(medidasSeguridadLocalBean.getC413()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			medidasSeguridadLocalBean.setPct414(new BigDecimal(medidasSeguridadLocalBean.getC414()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			medidasSeguridadLocalBean.setPct415(new BigDecimal(medidasSeguridadLocalBean.getC415()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			medidasSeguridadLocalBean.setPct416(new BigDecimal(medidasSeguridadLocalBean.getC416()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			medidasSeguridadLocalBean.setPct417(new BigDecimal(medidasSeguridadLocalBean.getC417()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
		}
		
		if(numeroComitesGestion>0){
			medidasSeguridadLocalBean.setPctOptimo(new BigDecimal(medidasSeguridadLocalBean.getOptimo()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			medidasSeguridadLocalBean.setPctBueno(new BigDecimal(medidasSeguridadLocalBean.getBueno()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			medidasSeguridadLocalBean.setPctRegular(new BigDecimal(medidasSeguridadLocalBean.getRegular()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
			medidasSeguridadLocalBean.setPctDeficiente(new BigDecimal(medidasSeguridadLocalBean.getDeficiente()).divide(new BigDecimal(numeroComitesGestion), new MathContext(3)));
		}
		
		medidasSeguridadLocalBean.setCalificacion(getCalificacionIndicador(medidasSeguridadLocalBean));

		return medidasSeguridadLocalBean;
	}


	private CondicionesExternasBean getTotalesPorcentajeCondicionesExternasBean(CondicionesExternasBean condicionesExternasBean, Long numeroComitesGestion, Long numeroLocales) {
		if(numeroLocales>0){
			condicionesExternasBean.setPct22(new BigDecimal(condicionesExternasBean.getC22()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
			condicionesExternasBean.setPct23(new BigDecimal(condicionesExternasBean.getC23()).divide(new BigDecimal(numeroLocales), new MathContext(3)));
		}
		return condicionesExternasBean;
	}


	private CalificacionBean[] getListaNivelesPorCalificacion(List items, int tipo) {
		if(items==null) return null;
		
		CalificacionBean[] beans = new CalificacionBean[4];
		
		CalificacionBean optimo = new CalificacionBean(CunamasConstants.CALIFICACION_OPTIMO);
		CalificacionBean bueno = new CalificacionBean(CunamasConstants.CALIFICACION_BUENO);
		CalificacionBean regular = new CalificacionBean(CunamasConstants.CALIFICACION_REGULAR);
		CalificacionBean deficiente = new CalificacionBean(CunamasConstants.CALIFICACION_DEFICIENTE);
		
		ItemBean item = null;
		
		for (Object object : items) {
			
			if(object instanceof ServiciosAlimentariosBean){
				ServiciosAlimentariosBean bean = (ServiciosAlimentariosBean)object;
				
				switch(tipo){
					case 0: item = new ItemBean(bean.getValor(), bean.getPctTotalOptimo().add(bean.getPctTotalBueno()),bean.getCalificacion()); 
					break;
							
					case 1: item = new ItemBean(bean.getValor(), bean.getCocinaBean().getPctOptimo().add(bean.getCocinaBean().getPctBueno()),bean.getCocinaBean().getCalificacion()); 
					break;
					
					case 2: item = new ItemBean(bean.getValor(), bean.getAlmacenBean().getPctOptimo().add(bean.getAlmacenBean().getPctBueno()),bean.getAlmacenBean().getCalificacion()); 
					break;
					
					case 3: item = new ItemBean(bean.getValor(), bean.getMedidasSeguridadBean().getPctOptimo().add(bean.getMedidasSeguridadBean().getPctBueno()),bean.getMedidasSeguridadBean().getCalificacion()); 
					break;
					
					case 4: item = new ItemBean(bean.getValor(), bean.getDocumentacionYRegistrosBean().getPctOptimo().add(bean.getDocumentacionYRegistrosBean().getPctBueno()),bean.getDocumentacionYRegistrosBean().getCalificacion()); 
					break;
				}
				
				if(item.getCalificacion().compareTo(CunamasConstants.CALIFICACION_OPTIMO)==0){
					optimo.getItems().add(item);
				}
				else{
					if(item.getCalificacion().compareTo(CunamasConstants.CALIFICACION_BUENO)==0){
						bueno.getItems().add(item);
					}
					else{
						if(item.getCalificacion().compareTo(CunamasConstants.CALIFICACION_REGULAR)==0){
							regular.getItems().add(item);
						}
						else{
							if(item.getCalificacion().compareTo(CunamasConstants.CALIFICACION_DEFICIENTE)==0){
								deficiente.getItems().add(item);
							}
						}
					}
				}
			}
			
			if(object instanceof LocalesBean){
				LocalesBean bean = (LocalesBean)object;
				
				switch(tipo){
					case 0: item = new ItemBean(bean.getValor(), bean.getPctTotalOptimo().add(bean.getPctTotalBueno()),bean.getCalificacion()); 
					break;
							
					case 1: item = new ItemBean(bean.getValor(), bean.getMedidasSeguridadLocalBean().getPctOptimo().add(bean.getMedidasSeguridadLocalBean().getPctBueno()),bean.getMedidasSeguridadLocalBean().getCalificacion()); 
					break;
					
					case 2: item = new ItemBean(bean.getValor(), bean.getImplementosBasicosBean().getPctOptimo().add(bean.getImplementosBasicosBean().getPctBueno()),bean.getImplementosBasicosBean().getCalificacion()); 
					break;
					
					case 3: item = new ItemBean(bean.getValor(), bean.getInstrumentosDocumentacionRegistrosBean().getPctOptimo().add(bean.getInstrumentosDocumentacionRegistrosBean().getPctBueno()),bean.getInstrumentosDocumentacionRegistrosBean().getCalificacion()); 
					break;
					
					case 4: item = new ItemBean(bean.getValor(), bean.getAparienciaActitudesConductaBean().getPctOptimo().add(bean.getAparienciaActitudesConductaBean().getPctBueno()),bean.getAparienciaActitudesConductaBean().getCalificacion()); 
					break;
				}
				

				if(item.getCalificacion().compareTo(CunamasConstants.CALIFICACION_OPTIMO)==0){
					optimo.getItems().add(item);
				}
				else{
					if(item.getCalificacion().compareTo(CunamasConstants.CALIFICACION_BUENO)==0){
						bueno.getItems().add(item);
					}
					else{
						if(item.getCalificacion().compareTo(CunamasConstants.CALIFICACION_REGULAR)==0){
							regular.getItems().add(item);
						}
						else{
							if(item.getCalificacion().compareTo(CunamasConstants.CALIFICACION_DEFICIENTE)==0){
								deficiente.getItems().add(item);
							}
						}
					}
				}
			}
			
		}
		
		Comparator comparador = Collections.reverseOrder();
		Collections.sort(optimo.getItems(),comparador);
		Collections.sort(bueno.getItems(),comparador);
		Collections.sort(regular.getItems(),comparador);
		Collections.sort(deficiente.getItems(),comparador);
		
		beans[0] = optimo;
		beans[1] = bueno;
		beans[2] = regular;
		beans[3] = deficiente;

		return beans;
	}
	
	private List<ItemBean> obtenerTotalItemsTabla(CalificacionBean[] beans){
		List<ItemBean> itemBeans = new ArrayList<ItemBean>();
		
		CalificacionBean optimo = beans[0];
		if(optimo!=null && optimo.getItems()!=null){
			for (ItemBean itemBean : optimo.getItems()) {
				itemBeans.add(itemBean);
			}
		}
		
		CalificacionBean bueno = beans[1];
		if(bueno!=null && bueno.getItems()!=null){
			for (ItemBean itemBean : bueno.getItems()) {
				itemBeans.add(itemBean);
			}
		}
		
		CalificacionBean regular = beans[2];
		if(regular!=null && regular.getItems()!=null){
			for (ItemBean itemBean : regular.getItems()) {
				itemBeans.add(itemBean);
			}
		}
		
		CalificacionBean deficiente = beans[3];
		if(deficiente!=null && deficiente.getItems()!=null){
			for (ItemBean itemBean : deficiente.getItems()) {
				itemBeans.add(itemBean);
			}
		}
		
		return itemBeans;
	}
	
	public List<ItemBean> obtenerCalificacionTabla(List items, int tipo){
		List<ItemBean> itemBeans = null;
		itemBeans = obtenerTotalItemsTabla(getListaNivelesPorCalificacion(items,tipo));
		return itemBeans;
	}
	
	private List<CalificacionBean> splitCalificacionBean(CalificacionBean calificacionBean, List<CalificacionBean> lista){
		if(calificacionBean==null) return lista;
		
		CalificacionBean calificacion = null;
		
		int size = calificacionBean.getItems().size();
		if(size==0){
			lista.add(calificacionBean);
		}
		int totalList = (int)Math.ceil(size * 1.0 / CunamasConstants.REGISTROS_MAXIMO_TABLA);
		
		int indexInitial = 0;
		int indexFinal = CunamasConstants.REGISTROS_MAXIMO_TABLA;
		
		for(int i=0;i<totalList;i++){
			if(indexInitial>size) break;
			if(indexFinal>size) indexFinal = size;
			
			calificacion = new CalificacionBean(calificacionBean.getCalificacion());
			calificacion.setItems(calificacionBean.getItems().subList(indexInitial, indexFinal));
			lista.add(calificacion);
			
			indexInitial = indexFinal;
			indexFinal += CunamasConstants.REGISTROS_MAXIMO_TABLA;
		}
		
		return lista;
	}

	private List<CalificacionBean> obtenerTablaCalificacion(CalificacionBean[] beans){
		List<CalificacionBean> lista = new ArrayList<CalificacionBean>();
		
		CalificacionBean optimo = beans[0];
		lista = splitCalificacionBean(optimo, lista);
		
		CalificacionBean bueno = beans[1];
		lista = splitCalificacionBean(bueno, lista);
		
		CalificacionBean regular = beans[2];
		lista = splitCalificacionBean(regular, lista);
		
		CalificacionBean deficiente = beans[3];
		lista = splitCalificacionBean(deficiente, lista);
		
		return lista;
	}


	public BigDecimal obtenerTotalComiteGestion(String ubigeo) {
		String cubigeo = "." + ubigeo.substring(0,2) + "." + ubigeo.substring(2,4) + "." + ubigeo.substring(4,6) + ".";
		cubigeo = cubigeo.replaceAll(".00.00.00.", "").replaceAll(".00.00.", "").replaceAll(".00.", "").replaceAll(".", "");
		
		Integer resultado = dynamicTextDao.countComiteGestion(cubigeo);
		return new BigDecimal(resultado);
	}


	public BigDecimal obtenerTotalModulos(String ubigeo) {
		String cubigeo = "." + ubigeo.substring(0,2) + "." + ubigeo.substring(2,4) + "." + ubigeo.substring(4,6) + ".";
		cubigeo = cubigeo.replaceAll(".00.00.00.", "").replaceAll(".00.00.", "").replaceAll(".00.", "").replaceAll(".", "");
		
		Integer resultado = dynamicTextDao.countModulos(cubigeo);
		return new BigDecimal(resultado);
	}
	
//	public static void main(String[] args){
//		CalificacionBean[] beans = new CalificacionBean[4];
//		
//		CalificacionBean optimo = new CalificacionBean(CunamasConstants.CALIFICACION_OPTIMO);
//		CalificacionBean bueno = new CalificacionBean(CunamasConstants.CALIFICACION_BUENO);
//		CalificacionBean regular = new CalificacionBean(CunamasConstants.CALIFICACION_REGULAR);
//		CalificacionBean deficiente = new CalificacionBean(CunamasConstants.CALIFICACION_DEFICIENTE);
//		
//		optimo.getItems().add(new ItemBean("ABA", new BigDecimal("98.0")));
//		optimo.getItems().add(new ItemBean("ABB", new BigDecimal("98.1")));
//		optimo.getItems().add(new ItemBean("ABC", new BigDecimal("98.2")));
//		optimo.getItems().add(new ItemBean("ABD", new BigDecimal("98.3")));
//		optimo.getItems().add(new ItemBean("ABE", new BigDecimal("98.4")));
//		optimo.getItems().add(new ItemBean("ABF", new BigDecimal("98.5")));
//		optimo.getItems().add(new ItemBean("ABG", new BigDecimal("98.6")));
//		optimo.getItems().add(new ItemBean("ABH", new BigDecimal("98.7")));
//		optimo.getItems().add(new ItemBean("ABI", new BigDecimal("98.8")));
//		optimo.getItems().add(new ItemBean("ABJ", new BigDecimal("98.9")));
//		optimo.getItems().add(new ItemBean("ABK", new BigDecimal("99.0")));
//		optimo.getItems().add(new ItemBean("ABL", new BigDecimal("99.1")));
//		optimo.getItems().add(new ItemBean("ABM", new BigDecimal("99.2")));
//		
//		bueno.getItems().add(new ItemBean("ABA", new BigDecimal("78.0")));
//		bueno.getItems().add(new ItemBean("ABB", new BigDecimal("78.1")));
//		bueno.getItems().add(new ItemBean("ABC", new BigDecimal("78.2")));
//		bueno.getItems().add(new ItemBean("ABD", new BigDecimal("78.3")));
//		
//		deficiente.getItems().add(new ItemBean("ABE", new BigDecimal("28.4")));
//		deficiente.getItems().add(new ItemBean("ABF", new BigDecimal("28.5")));
//		deficiente.getItems().add(new ItemBean("ABG", new BigDecimal("28.6")));
//		deficiente.getItems().add(new ItemBean("ABH", new BigDecimal("28.7")));
//
//		beans[0] = optimo;
//		beans[1] = bueno;
//		beans[2] = regular;
//		beans[3] = deficiente;
//		
//		List<CalificacionBean> lista = obtenerTablaCalificacion(beans);
//		
//		int i=1;
//		for (CalificacionBean calificacionBean : lista) {
//			System.out.println("lista="+i+" calificacion="+calificacionBean.getCalificacion());
//			for (ItemBean itemBean : calificacionBean.getItems()) {
//				System.out.println("descripcion="+itemBean.getDescripcion()+" valorPorcentaje="+itemBean.getValorPorcentaje());
//			}
//			i++;
//		}
//	}
}